package top.zhangjianyong.tools.indicator.strategy.impl;

import lombok.extern.slf4j.Slf4j;
import top.zhangjianyong.tools.indicator.context.IndicatorContext;
import top.zhangjianyong.tools.indicator.model.TechnicalIndicatorResult;
import top.zhangjianyong.tools.indicator.strategy.TechnicalIndicator;

/**
 * 技术指标抽象基类
 * 提供通用的数据验证和错误处理
 *
 * @author zhangjianyong
 * @date 2024/01/01
 */
@Slf4j
public abstract class AbstractIndicator implements TechnicalIndicator {

    @Override
    public boolean canCalculate(IndicatorContext context) {
        if (context == null || context.isEmpty()) {
            return false;
        }
        return context.getDataSize() >= getMinDataSize();
    }

    @Override
    public TechnicalIndicatorResult calculate(IndicatorContext context) {
        try {
            if (!canCalculate(context)) {
                return TechnicalIndicatorResult.failure(
                    getName(),
                    String.format("数据不足，需要至少%d条数据，当前只有%d条", getMinDataSize(), context.getDataSize())
                );
            }
            return doCalculate(context);
        } catch (Exception e) {
            log.error("计算指标{}时发生错误: {}", getName(), e.getMessage(), e);
            return TechnicalIndicatorResult.failure(getName(), "计算失败: " + e.getMessage());
        }
    }

    /**
     * 子类实现具体地计算逻辑
     *
     * @param context 计算上下文
     * @return 计算结果
     */
    protected abstract TechnicalIndicatorResult doCalculate(IndicatorContext context);
}

